package cn.yyx.aclservice.helper;
import cn.yyx.aclservice.entity.Permission;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 根据权限数据构建菜单数据
 * </p>
 * @author qy
 * @since 2019-11-11
 */
public class PermissionHelper {
    /**
     * 使用递归方法建菜单 该方法的最终作用就是  找出顶级菜单为其标记 level为1 并且组织
     * 了菜单之间的父子关系  基于children集合来组织的。
     * @param treeNodes
     * @return
     */
    public static List<Permission> bulid(List<Permission> treeNodes) {
        List<Permission> trees = new ArrayList<>();
        for (Permission treeNode : treeNodes) {
            //一个用的一次菜单查询  pid 为0的只可能出现一次  因为就是顶级菜单“全部权限”
            //所以只要找到了就可以循环结束了
            if ("0".equals(treeNode.getPid())) {
                //层级设置为1
                treeNode.setLevel(1);
                //treeNode 此时的 treeNode就是代表 顶级菜单 相当于找到了根节点
                trees.add(findChildren(treeNode,treeNodes));
                break;//循环结束1
            }
        }
        return trees;
    }
    /**
     * 递归查找子节点 组织菜单之间的父子关系
     * @param treeNode  第一次调用的时候就是跟节点
     * @param treeNodes
     * @return
     */
    public static Permission findChildren(Permission treeNode,List<Permission> treeNodes) {
        //创建子节点权限集合
        treeNode.setChildren(new ArrayList<Permission>());
        //treeNode 传递过来的节点
        // treeNodes 节点集合
        for (Permission it : treeNodes) {
            if(treeNode.getId().equals(it.getPid())) {//如果treeNode 是 it的父节点
                int level = treeNode.getLevel() + 1;//在父节点的level上再加1
                it.setLevel(level);
                //为treeNode节点添加子节点（添加到集合中）
                treeNode.getChildren().add(findChildren(it,treeNodes));
            }
        }
        return treeNode;
    }
}
